package cn.com.zzl.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Description：服务端编程demo
 * Created by 朱正磊 on 2017-05-23 10:52.
 */
public class ServerDemo {

	public static void main(String[] args) throws IOException {

		//监听服务（监听客户端发来的请求），6789指的是该服务器的监听服务（也可以称之为服务）的端口号
		//serverSocket就是启动了一个线程
		@SuppressWarnings("resource")
		ServerSocket serverSocket = new ServerSocket(6789);

		//while循环，因为serverSocket.accept()会发生阻塞，需要循环等待，时刻监听
		while (true){

			//监听客户端的请求
			//socket其实就是获取客户端跟服务器建立的连接
			//当该服务启动之后，服务就会停留在该处，进行客户端请求的监听
			//accept()这是一个阻塞的方法，如果客户端没有请求就阻塞在这里，如果客户端有请求就继续往下执行
			Socket socket = serverSocket.accept();

			//在服务器把客户端的请求输出来，使用输入流，其实就是读取客户端说的话
			//如果是服务器跟客户端说话，也就是服务器对客户端请求的响应，那么就应该使用输出流
			//字节流因为是一个字节一个字节进行数据传输，效率有限，我们最好应该使用字符流
			InputStream inputStream = socket.getInputStream();

			//我们应该使用带有缓冲功能的字符输入流
			BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

			//String saying = bufferedReader.readLine();
			//System.out.println("客户端说：" + saying);

			StringBuilder stringBuilder = new StringBuilder();
			String line ;
			while((line = bufferedReader.readLine()) != null){
				stringBuilder.append(line + "\r\n");//\r\n表示换行
			}
			String saying = stringBuilder.toString();
			System.out.println("客户端说：" + saying);

			//关闭资源
			bufferedReader.close();
			inputStream.close();
			socket.close();
			//serverSocket不能关，要一直开着，不然怎么进行监听客户端的请求
			//serverSocket.close();

		}
	}

}
